/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.gestionuniversitaria.dataLayer;

import com.sistema.gestionuniversitaria.BusinessLayer.Carrera;
import java.sql.*;
import java.util.ArrayList;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author Max
 */
public class CarreraData extends BaseData {

    ArrayList<Carrera> carreras;

    public CarreraData() {
    }

    /*
     * Búsqueda general de las carreras
     */
    public ArrayList<Carrera> getCarreras() throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        carreras = new ArrayList<Carrera>();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_CARRERAS()}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Carrera carrera = new Carrera();
                carrera.setCodigo(resultSet.getString("codigo"));
                carrera.setNombre(resultSet.getString("nombre"));
                carrera.setTitulo(resultSet.getString("titulo"));
                carreras.add(carrera);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        if (carreras == null || carreras.isEmpty()) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }

        return carreras;
    }

    /*
     * Búsqueda de Carrera por código
     */
    public Carrera getCarreraPorCodigo(String codigo) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        Carrera carrera = new Carrera();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_CARRERAS_POR_CODIGO(?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            if (resultSet.next()) {
                carrera.setCodigo(resultSet.getString("codigo"));
                carrera.setNombre(resultSet.getString("nombre"));
                carrera.setTitulo(resultSet.getString("titulo"));
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
        if (carrera
                == null) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }
        return carrera;
    }

    /*
     * Búsqueda de las carreras por nombre
     */
    public ArrayList<Carrera> getCarreraPorNombre(String nombre) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        String sqlSelectCarreras = "SELECT codigo,nombre,titulo FROM CARRERA where nombre like '%" + nombre + "%'";
        PreparedStatement statement = null;
        carreras = new ArrayList<Carrera>();
        ResultSet resultSet = null;
        try {
            statement = conexion.prepareStatement(sqlSelectCarreras);
            resultSet = statement.executeQuery();
            while (resultSet.next()) {
                Carrera carrera = new Carrera();
                carrera.setCodigo(resultSet.getString("codigo"));
                carrera.setNombre(resultSet.getString("nombre"));
                carrera.setTitulo(resultSet.getString("titulo"));
                carreras.add(carrera);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        if (carreras == null || carreras.isEmpty()) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }

        return carreras;
    }

    /*
     * Insertar una nueva carrera
     */
    public void insertarCarrera(String codigo, String nombre, String titulo) throws NoDataException, ExcepcionGlobal {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarCarrera = null;
        try {
            cstmtInsertarCarrera = conexion.prepareCall("{call INSERTAR_CARRERA (?,?,?)}");
            cstmtInsertarCarrera.setString(1, codigo);
            cstmtInsertarCarrera.setString(2, nombre);
            cstmtInsertarCarrera.setString(3, titulo);
            boolean resultado = cstmtInsertarCarrera.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarCarrera != null) {
                    cstmtInsertarCarrera.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    /*
     * Actualizar un carrera
     */
    public void actualizarCarrera(String codigo, String nombre, String titulo) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarCarrera = null;
        try {
            cstmtInsertarCarrera = conexion.prepareCall("{call ACTUALIZAR_CARRERA (?,?,?)}");
            cstmtInsertarCarrera.setString(1, codigo);
            cstmtInsertarCarrera.setString(2, nombre);
            cstmtInsertarCarrera.setString(3, titulo);
            boolean resultado = cstmtInsertarCarrera.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarCarrera != null) {
                    cstmtInsertarCarrera.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    /*
     * Eliminar un carrera
     */
    public void eliminarCarrera(String codigo) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarCarrera = null;
        try {
            cstmtInsertarCarrera = conexion.prepareCall("{call ELIMINAR_CARRERA (?)}");
            cstmtInsertarCarrera.setString(1, codigo);
            boolean resultado = cstmtInsertarCarrera.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la operación");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarCarrera != null) {
                    cstmtInsertarCarrera.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }
}